"""
__author__ = '霍格沃兹测试开发学社'
__desc__ = '更多测试开发技术探讨，请访问：https://ceshiren.com/t/topic/15860'
"""

'''
作业：
实现学生管理系统：

学生信息包含：
    - 编号（sid), 姓名（name), 年龄（age), 性别（gender) 四个信息
    - 每个学生信息使用字典形式保存
    - 使用列表保存所有学生的信息 

1. 实现菜单函数，输出下列信息，返回用户输入的编号，并进行输入校验。

    print("****************************************")
    print("*				学生管理系统			 *")
    print("*  	    1. 添加新学生信息              *")
    print("* 	    2. 通过学号修改学生信息		 *")
    print("*		3. 通过学号删除学生信息		 *")
    print("*		4. 通过姓名删除学生信息		 *")
    print("* 	    5. 通过学号查询学生信息          *")
    print("*		6. 通过姓名查询学生信息          *")
    print("*		7. 显示所有学生信息             *")
    print("*		8. 退出系统			  		 *")
    print("****************************************")
    select_op = input("输入编号选择操作：")

2. 实现控制函数，用来控制菜单的输出与功能的选择，直到用户选择8，结束程序运行。
3. 实现添加学生函数，函数参数为编号，姓名，年龄，性别四个参数，返回是否添加成功的结果，要求编号不可重复。
4. 实现修改函数，参数为学号，如果学生存在，则进行修改，不存在输出提示，并返回是否修改成功
5. 实现删除函数，参数为学号，如果学生存在，则进行删除，不存在输出提示，并返回是否删除成功
6. 实现删除函数，参数为姓名，如果学生存在，则进行删除（同名学生全部删除），不存在输出提示，并返回是否删除成功
7. 实现查询函数，参数为学号，如果学生存在，则输出学生信息，不存在输出提示，并返回是否查询成功
8. 实现查询函数，参数为姓名，如果学生存在，则输出学生信息（同名学生全部输出），不存在输出提示，并返回是否删除成功
9. 实现函数，输出所有学生信息
'''


# 定义文件操作类
class Makefile:
    def __init__(self):
        self.filepath = "D:\\Users\\test.txt"

    def write_stu_file(self, data):
        with open(self.filepath, "w", encoding="Utf-8") as file:
            data = str(data)
            file.write(data)

    def read_stu_file(self):
        with open(self.filepath, "r", encoding="Utf-8") as file:
            content = file.read()
            return content


class Student:
    def __init__(self):
        self.stu_list = []

    def menu(self):
        print("****************************************")
        print("*				学生管理系统			 *")
        print("*  	    1. 添加新学生信息              *")
        print("* 	    2. 通过学号修改学生信息		 *")
        print("*		3. 通过学号删除学生信息		 *")
        print("*		4. 通过姓名删除学生信息		 *")
        print("* 	    5. 通过学号查询学生信息          *")
        print("*		6. 通过姓名查询学生信息          *")
        print("*		7. 显示所有学生信息             *")
        print("*		8. 退出系统			  		 *")
        print("****************************************")

    def add_stu(self, id, name, age, gender):
        stu_info = {"id": id,
                    "name": name,
                    "age": age,
                    "gender": gender
                    }
        id_list = []
        for stu in self.stu_list:
            id_list.append(stu["id"])
        if id not in id_list:
            self.stu_list.append(stu_info)
            Makefile().write_stu_file(self.stu_list)
            print(f"{name}同学添加成功")
        else:
            print("id重复无法添加")

    # 通过id修改学生
    def modify_stu_by_id(self, id, name, age, gender):
        stu_info = {"id": id,
                    "name": name,
                    "age": age,
                    "gender": gender
                    }
        if not self.stu_list:
            print("空学生列表")
            pass
        else:
            id_list = []
            for stu in self.stu_list:
                id_list.append(stu["id"])
            if id not in id_list:
                print(f"id为{id}的学生不存在，无法修改")
            else:
                for s in range(len(self.stu_list)):
                    if id == self.stu_list[s]["id"]:
                        self.stu_list[s] = stu_info
                        Makefile().write_stu_file(self.stu_list)
                        print(f"{name}同学修改成功")
                        break

    # 3.通过ID删除学生
    def delete_stu_by_id(self, id: int):
        makefile = Makefile()
        content = makefile.read_stu_file()
        self.stu_list = eval(content)
        if not self.stu_list:
            print("空学生列表")
            pass
        id_list = []
        for stu in self.stu_list:
            id_list.append(stu["id"])
        if id not in id_list:
            print(f"id为{id}的学生不存在或已删除")
        else:
            for stu in self.stu_list:
                if stu["id"] == id:
                    self.stu_list.remove(stu)
                    makefile.write_stu_file(self.stu_list)
                    print("删除成功")
                    break

    # 4.通过姓名删除学生信息
    def delete_stu_by_name(self, name):
        makefile = Makefile()
        content = makefile.read_stu_file()
        self.stu_list = eval(content)
        if not self.stu_list:
            print("空学生列表")
            pass
        name_list = []
        for stu in self.stu_list:
            name_list.append(stu["name"])
        if name not in name_list:
            print("该学生不存在")
        else:
            for s in range(len(self.stu_list)):
                for stu in self.stu_list:
                    if name == stu["name"]:
                        self.stu_list.remove(stu)
                        makefile.write_stu_file(self.stu_list)
                        print(f"{name}同学删除成功")
                        break

    # 5.通过学号查询学生信息
    def query_stu_by_id(self, id):
        makefile = Makefile()
        content = makefile.read_stu_file()
        self.stu_list = eval(content)
        if not self.stu_list:
            print("空学生列表")
            pass
        elif self.stu_list:
            id_list = []
            for stu in self.stu_list:
                id_list.append(stu["id"])
            if id not in id_list:
                print(f"id为{id}的学生不存在或已删除")
            for stu in self.stu_list:
                if id == stu["id"]:
                    print(stu)
                    break

    # 6.通过姓名查看学生信息
    def query_stu_by_name(self, name):
        makefile = Makefile()
        content = makefile.read_stu_file()
        self.stu_list = eval(content)
        if not self.stu_list:
            print("空学生列表")
            pass
        name_list = []
        for stu in self.stu_list:
            name_list.append(stu["name"])
        if name not in name_list:
            print("该学生不存在")
        else:
            for stu in self.stu_list:
                if name == stu["name"]:
                    print(stu, end=" | ")

    # 7.显示所有学生信息
    def query_stu_all(self):
        makefile = Makefile()
        content = makefile.read_stu_file()
        self.stu_list = eval(content)
        if not self.stu_list:
            print("空学生列表")
            pass
        else:
            print(self.stu_list)


if __name__ == '__main__':
    my_stu_info = Student()
    makefile = Makefile()
    my_stu_info.menu()
    select_menu = "0"
    while True:
        select_menu = (input("请选择操作菜单:"))
        match select_menu:
            case "1":
                my_stu_info.add_stu(1, "Tom", 10, "女")
                my_stu_info.add_stu(2, "Timi", 20, "女")
                my_stu_info.add_stu(3, "Timi", 20, "女")
                my_stu_info.add_stu(4, "Jack", 20, "男")
                my_stu_info.add_stu(4, "Jack", 20, "男")
                print(makefile.read_stu_file())
            case "2":
                my_stu_info.modify_stu_by_id(5, "Jack", 20, "男")
                my_stu_info.modify_stu_by_id(3, "COCO", 20, "女")
                print(makefile.read_stu_file())
            case "3":
                my_stu_info.delete_stu_by_id(4)
                my_stu_info.delete_stu_by_id(5)
                print(makefile.read_stu_file())
            case "4":
                my_stu_info.delete_stu_by_name("Tom")
                my_stu_info.delete_stu_by_name("Timi")
                print(makefile.read_stu_file())
            case "5":
                my_stu_info.query_stu_by_id(1)
                my_stu_info.query_stu_by_id(3)
            case "6":
                my_stu_info.query_stu_by_name("Tom")
                my_stu_info.query_stu_by_name("Timi")
            case "7":
                my_stu_info.query_stu_all()
            case "8":
                print("退出系统")
                break
            case _:
                print("菜单选择错误")

